package 代理模式.cglib动态代理;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 我们要使用 cgLib 实现动态代理的功能
 * 注意：cglib 需要引入 cglib 的 jar 文件，因为 spring 包含 cglib 的功能，所以引入 spring-core 的 jar 包也可以
 */
public class Main {
	public static void main(String[] args) {
		String name = "小明";
		Ticketer buyer = new Ticketer(name);
		// util
		Enhancer enhancer = new Enhancer();
		//	 需要为代理对象 设置一个父类
		enhancer.setSuperclass(buyer.getClass());
		//	 需要为代理对象设置一个 回调函数
		enhancer.setCallback(new MethodInterceptor() {
			@Override
			public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
				Object obj;
				// 由于这个 intercept 是callback，
				// 所以 在真正buyTicket的时候 这个方法会被执行
				// 这里就可以在 buyTicket 之前进行操作
				if ("buyTicket".equals(method.getName())) {
					System.out.println("这里是代理方法：开始刷票");
					obj = method.invoke(buyer, args);
					System.out.println("这里是代理方法： 刷票成功，通知客户");
				} else {
					obj = method.invoke(buyer, objects);
				}
				return obj;
			}
		});

		Ticketer ticketer = (Ticketer) enhancer.create();
		goToBuyTicket(name, ticketer);

	}

	private static void goToBuyTicket(String name, Ticketer ticketer) {
		ticketer.login(name, "123");
		ticketer.buyTicket();
	}
}
